from pypinyin import lazy_pinyin
import difflib

def switch_pattern(pattern_name, pattern_list=["电梯模式", "对话模式"], key_words="模式", similarity_threshold=0.7):
    """
    增强版模式切换：支持全拼、简拼、模糊拼音匹配
    拼音相似度≥阈值才返回匹配结果，否则返回原输入
    
    Args:
        pattern_name: 用户输入的模式名称
        pattern_list: 可用模式列表
        key_words: 关键词，必须包含才能进行切换
        similarity_threshold: 相似度阈值，默认0.7
    
    Returns:
        最接近的模式名称或原输入
    """
    # 检查是否包含关键词
    if key_words not in pattern_name:
        return pattern_name  # 没有关键词，返回原输入
    
    # 移除关键词，只保留模式核心部分
    core_pattern_name = pattern_name.replace(key_words, "").strip()
    
    # 如果核心部分为空（即只有关键词），返回原输入
    if not core_pattern_name:
        return pattern_name
    
    best_match = None
    best_score = 0
    
    for pattern in pattern_list:
        core_pattern = pattern.replace(key_words, "").strip()
        
        # 如果模式的核心部分也为空，跳过（不应该发生）
        if not core_pattern:
            continue
        
        # 计算多种拼音相似度，取最大值
        similarity = max(
            calculate_full_pinyin_similarity(core_pattern_name, core_pattern),
            calculate_short_pinyin_similarity(core_pattern_name, core_pattern),
            calculate_string_similarity(core_pattern_name, core_pattern)
        )
        
        # 更新最佳匹配（只记录相似度≥阈值的）
        if similarity >= similarity_threshold and similarity > best_score:
            best_score = similarity
            best_match = pattern
    
    # 只有相似度≥阈值才返回匹配结果，否则返回原输入
    return best_match if best_match is not None else pattern_name

def calculate_full_pinyin_similarity(text1, text2):
    """计算全拼相似度"""
    try:
        pinyin1 = ' '.join(lazy_pinyin(text1))
        pinyin2 = ' '.join(lazy_pinyin(text2))
        return difflib.SequenceMatcher(None, pinyin1.lower(), pinyin2.lower()).ratio()
    except:
        return 0

def calculate_short_pinyin_similarity(text1, text2):
    """计算简拼相似度（首字母）"""
    try:
        short1 = ''.join([p[0] for p in lazy_pinyin(text1) if p])
        short2 = ''.join([p[0] for p in lazy_pinyin(text2) if p])
        return difflib.SequenceMatcher(None, short1.lower(), short2.lower()).ratio()
    except:
        return 0

def calculate_string_similarity(text1, text2):
    """计算原字符串相似度"""
    return difflib.SequenceMatcher(None, text1.lower(), text2.lower()).ratio()

if __name__ == "__main__":
    # test_switch_pattern()
    
    # 演示不同阈值的效果
    print("=" * 60)
    print("不同阈值效果演示：")
    
    test_inputs = ["电话模式", "电ss楼模式"]
    
    for input_text in test_inputs:
        print(f"输入: '{input_text}'")
        for threshold in [0.5, 0.6, 0.7, 0.8, 0.9]:
            result = switch_pattern(input_text, similarity_threshold=threshold)
            print(f"  阈值 {threshold}: '{result}'")
        print()